// axios 基础的封装
import axios from "axios";

import { ElMessage } from 'element-plus'
import 'element-plus/theme-chalk/el-message.css'
import {useUserStore} from "@/stores/userstore.js";
import router from "@/router/index.js";
const instance =    axios.create({
    baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
    timeout: 5000
})

// axios请求拦截器
//  设置了一个请求拦截器。该拦截器会在每次发送请求前执行一个函数，
//  该函数接收一个参数 config，即 Axios 请求配置对象。在这个函数中，
//  对 config 对象没有进行任何修改，直接将其返回。这表示请求将以原样的配置发送出去。
//  如果你想要在请求发送前对其进行修改，你可以在这个函数中进行相应的操作，然后返回修改后的 config 对象。
// instance.interceptors.request.use(config => {
//     return config
// },
// 第二个参数是一个可选的错误处理函数，用于处理在请求拦截器中出现的错误。
// 如果请求拦截器中发生了错误，该函数将会被调用，并接收到这个错误对象 e。在这个例子中，
// 错误处理函数简单地将错误对象 e 包装成一个被拒绝的 Promise，并将其返回，以便在之后的链式调用中捕获和处理这个错误。
// e => Promise.reject(e))
instance.interceptors.request.use(config => {
    // 从pinia 获取数据 token
    const userStore = useUserStore()
    const token = userStore.userInfo.token
    if (token){
        config.headers.Authorization = `Bearer ${token}`
    }
    return config
}, e => Promise.reject(e))

// axios响应式拦截器
instance.interceptors.response.use(res => res.data, e => {
    const userStore = useUserStore()
    // 统一错误提示
    ElMessage({
        type:'warning',
        message:e.response.data.message
    })
    // 401token失效处理
    // 1.清除本地用户数据
    if (e.response.status === 401){
        userStore.clearUserInfo()
        //2。跳转到登录页
        router.push('/login')
    }

    return Promise.reject(e)
})


export default instance
